1. Prompt Template
Written: 2026.06 在与大语言模型交互时,通常不会直接将用户的原始输入直接传递给大模型,而是会先进行一系列包装、组织和格式化操作。这样做的目的是:更清晰地表达用户意图,更好地利用模型能力1.1 提示词模板介绍
1.1.1 为什么需要提示词模板
这套结构化的提示词构建方式,就是 LangChain 中的 提示词模板(PromptTemplate),对于 LLM 应用来说,好的提示词就是成功的一半。更多提示词技巧可参考文档:https://www.cuiliangblog.cn/detail/section/228046450 LangChain 提示词官方文档参考:https://reference.langchain.com/python/langchain_core/prompts/1.1.2 提示词模板分类
LangChain 提供了多种不同的提示词模板,下面介绍几种常用的提示词模板:-
PromptTemplate:文本生成模型提示词模板,用字符串拼接变量生成提示词 -
ChatPromptTemplate:聊天模型提示词模板,适用于如gpt-3.5-turbo、gpt-4等聊天模型 -
HumanMessagePromptTemplate:人类消息提示词模板 -
SystemMessagePromptTemplate:系统消息提示词模板 -
FewShotPromptTemplate:少样本学习提示词模板, 构建一个 Prompt,其中包含多个 示例,可以 自动将这些示例格式化并插入到主 Prompt 中 。 -
PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用。
1.1.3 提示词模板类继承关系
分析LangChain源码可知,在LangChain的类结构中,顶层基类是BasePromptTemplate,用于定义Prompt模板系统必须实现的核心方法,而StringPromptTemplate 和 BaseChatPromptTemplate两个子类分别继承该顶层基类

BaseChatPromptTemplate;而文本生成模型则继承StringPromptTemplate
1.2 文本提示词模板
PromptTemplate 针对文本生成模型的提示词模板,也是LangChain提供的最基础的模板,通过格式化字符串生成提示词,在执行invoke时将变量格式化到提示词模板中
主要参数:
template:定义提示词模板的字符串,其中包含文本和变量占位符(如{name})
input_variables: 列表,指定了模板中使用的变量名称,在调用模板时被替换
partial_variables:字典,用于定义模板中一些固定的变量名。这些值不需要再每次调用时被替换
函数介绍:
format():给input_variables变量赋值,并返回提示词。利用format() 进行格式化时就一定要赋值,否则会报错。当在template中未设置input_variables,则会自动忽略。
1.3 创建文本提示词
1.3.1 使用构造方法
使用构造方法
输出格式化后的提示词内容:
1.3.2 调用 from_template(常用)
调用from_template
输出生成的提示词
1.3.3 部分提示词模板
部分提示词,顾名思义就是允许你预先固定部分变量,而保留其他变量在后续动态填充。例如:先预设系统参数,然后等用户输入后再补齐提示词模板。部分提示词
然后格式化问题生成最终提示词
1.3.4 组合提示词模板
通过将多个子提示(Prompt)按一定逻辑顺序或层级组合起来,形成一个复杂任务的整体 Prompt。例如实现多消息对话、多阶段任务、多输入源组合等场景。组合提示词模板
填充组合后模板的占位符,生成最终的提示词
1.4 文本提示词方法
上述的代码示例中,我们使用了format方法,除了format方法能够格式化提示词模板,invoke()和partial()方法也可以做到,以下是它们的作用:
invoke:格式化提示词模板为PromptValue
format:格式化提示词模板为字符串
partial:格式化提示词模板为一个新的提示词模板,可以继续进行格式化
1.4.1 format
format() 方法用法如下,将question 参数格式化到提示词模板中,返回一个字符串:
format()方法
输出生成的提示词
1.4.2 partial
partial()方法用法如下,可以格式化部分变量,并且继续返回一个模板,通常在部分提示词模板场景下使用partial
输出生成的提示词
1.4.3 invoke
invoke() 是 LangChain Expression Language(LCEL 的统一执行入口,用于执行任意可运行对象(Runnable )。返回的是一个 PromptValue 对象,可以用 .to_string() 或 .to_messages() 查看内容
invoke()方法
to_string()方法将PromptValue转换为可读的字符串格式
1.5 对话提示词模板
ChatPromptTemplate 是专为聊天模型(如 gpt-3.5-turbo、gpt-4 等)设计的提示词模板,它支持构造多轮对话的消息结构,每条消息可指定角色(如系统、用户、AI)。
特点:
- 支持 System / Human / AI 等不同角色的消息模板
- 对话历史维护
1.6 创建对话提示词
1.6.1 使用构造方法
创建提示词-构造方法
user_input: 用户的当前输入
1.6.2 调用 from_messages(常用)
代码示例如下,提示词模板中包含两条消息,第一条是系统消息,无需做提示词渲染,第二条是人类消息,在执行invoke时,需要把变量question渲染进去。调用form_message
输出生成的提示内容
1.7 对话提示词方法
除了之前在PromptTemplate介绍的 format、partial、invoke外,还有 format_messages 和 format_prompt方法。
1.7.1 format_messages
作用:将模板变量替换后,直接生成 消息列表(List[BaseMessage]),一般包含:SystemMessage``HumanMessage``AIMessage
常用场景:用于手动查看或调试 Prompt 的最终“消息结构”,或者自己拼接进 Chain。
代码如下
format_message
打印格式化后的提示消息
1.7.2 format_prompt
作用:生成一个PromptValue 对象,这是一种抽象层次更高的封装。
-
对于
PromptTemplate(单纯文本),返回StringPromptValue -
对于
ChatPromptTemplate(对话模板),返回ChatPromptValue
PromptValue 有两个常用方法:
-
.to_string()→ 转成文本 -
.to_messages()→ 转成消息列表(同上)
PromptValue 对象
代码如下
format_prompt
将提示转换为消息列表并打印
1.8 对话提示词实例化参数类型
前面讲了ChatPromptTemplate的两种创建方式。我们看到不管使用构造方法,参数类型都是列表类型。参数除了是列表类型,列表的元素可以是字符串、字典、字符串构成的元组、消息类型、提示词模板类型、消息提示词模板类型等1.8.1 str 类型
列表参数格式是str类型(不推荐),因为默认都是HumanMessage。 代码如下str 类型
打印格式化后的消息内容
1.8.2 dict 类型
列表参数格式是dict类型,代码如下:dict 类型
打印格式化后的消息内容
1.8.3 message 类型
System/Human/AIMessage 是 langchain 中用于构建不同角色的一个类。它通常用于创建聊天消息的一部分,特别是当你构建一个多轮对话的 prompt 模板时,区分系统、AI、和人类消息。
代码如下
message 类型
打印格式化后的消息内容
1.8.4 BaseChatPromptTemplate 类型
使用 BaseChatPromptTemplate,可以理解为ChatPromptTemplate里嵌套了ChatPromptTemplate。BaseChatPromptTemplate 类型
打印生成的消息内容
1.8.5 BaseMessagePromptTemplate 类型
LangChain提供不同类型的MessagePromptTemplate。最常用的是SystemMessagePromptTemplate 、HumanMessagePromptTemplate 和AIMessagePromptTemplate ,分别创建系统消息、人工消息和AI消息,它们是ChatMessagePromptTemplate的特定角色子类。 基本概念: HumanMessagePromptTemplate,专用于生成用户消息(HumanMessage) 的模板类,是ChatMessagePromptTemplate的特定角色子类。- 本质:预定义了 role=“human” 的 MessagePromptTemplate,且无需无需手动指定角色
- 模板化:支持使用变量占位符,可以在运行时填充具体值
- 格式化:能够将模板与输入变量结合生成最终的聊天消息
- 输出类型:生成 HumanMessage 对象( content + role=“human” )
- 设计目的 :简化用户输入消息的模板化构造,避免重复定义角色
- 角色指定:可以为每条消息指定角色(如 “system”、“human”、“ai”) 等,角色灵活。
- 模板化:支持使用变量占位符,可以在运行时填充具体值
- 格式化:能够将模板与输入变量结合生成最终的聊天消息
BaseMessagePromptTemplate 类型
格式化消息并打印结果
1.9 少量样本提示词模板
1.9.1 FewShotPromptTemplate
FewShotPromptTemplate 用于:
- 构建一个 Prompt,其中包含多个 示例(examples);
- 自动将这些示例格式化并插入到主 Prompt 中;
- 实现 Few-Shot Prompting 方式,以增强大模型在特定任务(如分类、问答、翻译等)上的表现。
-
examples:少量的人工示例(dict 列表); -
example_prompt:如何格式化每个示例(使用PromptTemplate); -
prefix:示例之前的文字说明(可选); -
suffix:用户真正的问题模板; -
input_variables:最终 suffix 中需要传入的变量。
FewShotPromptTemplate
生成最终的 prompt
1.9.2 FewShotChatMessagePromptTemplate
除了FewShotPromptTemplate之外,FewShotChatMessagePromptTemplate是专门为 聊天对话场景设计的少样本(few-shot)提示模板,它继承自 FewShotPromptTemplate ,但针对聊天消息的格式进行了优化。 特点:- 自动将示例格式化为聊天消息( HumanMessage / AIMessage 等)
- 输出结构化聊天消息( List[BaseMessage] )
- 保留对话轮次结构
FewShotChatMessagePromptTemplate
格式化并打印最终提示模板,传入具体问题'3✖️2'
1.9.3 Example selectors
前面FewShotPromptTemplate的特点是,无论输入什么问题,都会包含全部示例。在实际开发中,我们可以根据当前输入,使用示例选择器,从大量候选示例中选取最相关的示例子集。 使用的好处:避免盲目传递所有示例,减少 token 消耗的同时,还可以提升输出效果。 示例选择策略:语义相似选择、长度选择、最大边际相关示例选择等- 语义相似选择:通过余弦相似度等度量方式评估语义相关性,选择与输入问题最相似的 k 个示例。
- 长度选择:根据输入文本的长度,从候选示例中筛选出长度最匹配的示例。增强模型对文本结构的理解。比语义相似度计算更轻量,适合对响应速度要求高的场景。
- 最大边际相关示例选择:优先选择与输入问题语义相似的示例;同时,通过惩罚机制避免返回同质化的内容。
Example selectors
格式化提示模板,将'开心'作为输入生成最终提示字符串
1.10 消息占位符提示词模板
如果我们不确定消息何时生成,也不确定要插入几条消息,比如在提示词中添加聊天历史记忆这种场景,可以在ChatPromptTemplate添加MessagesPlaceholder占位符,在调用invoke时,在占位符处插入消息。
1.10.1 使用 MessagesPlaceholder
使用MessagesPlaceholder
打印生成的完整 prompt 文本,格式化后的聊天记录
1.10.2 隐式使用 MessagesPlaceholder
"placeholder" 是 ("placeholder", "{memory}") 的简写语法,等价于 MessagesPlaceholder("memory")。
隐式使用MessagesPlaceholder
使用 .to_string() 将格式化后的对话链转换成纯文本字符串,方便查看输出
1.11 提示词模板仓库
LangChain Hub 是一个公共的 prompt(提示词)仓库,访问地址是https://smith.langchain.com/hub。类似 HuggingFace Hub,但是专门存放 LangChain 的 Prompt、Chains、Tools 等。我们可以在 hub 中搜索通用的提示词模板并使用。代码如下:提示词模板仓库
或者访问具体字段

